package com.demo.java.OD351_400.OD374;

import java.io.*;
import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【模拟工作队列(B卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146232817
 */
public class OdMain {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer st = new StreamTokenizer(br);
    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws Exception {
        // 读取任务数量和每个任务的执行时间
        String[] kk = br.readLine().split(" ");
        int a = nextInt(), b = nextInt(); // 读取两个整数a和b
        int[] x = new int[100]; // 创建一个整数数组x，用于存储数据

        for (int i = 0; i < kk.length; i++) {
            x[i] = Integer.parseInt(kk[i]); // 将分割后的数据转换为整数并存储到数组x中
        }

        // 创建队列q，用于存储任务索引，并初始化一个优先队列q1用于处理任务
        Queue<Integer> q = new LinkedList<>();
        PriorityQueue<Integer> q1 = new PriorityQueue<>();
        int ans = 0, max = 0, l = 0; // 初始化一些变量，用于记录最终的结果

        for (int i = 1; i <= 1000; i++) { // 从1到1000循环遍历任务
            // 处理q1中小于等于当前时间i的任务
            while (!q1.isEmpty() && q1.peek() <= i) {
                q1.poll(); // 移除队列中的元素
            }

            // 处理q1中任务不足b个的情况，选择空闲的机器继续任务
            while (q1.size() < b && !q.isEmpty()) {
                int m = q.poll(); // 从队列q中取出任务
                if (x[m] <= i) { // 判断任务是否可以执行
                    q1.add(i + x[m + 1]); // 将任务执行后的时间加入优先队列
                    max = Math.max(max, i + x[m + 1]); // 更新任务的最大完成时间
                } else break;
            }

            // 如果x[l]等于当前时间，分配任务
            if (x[l] == i) {
                if (q1.size() < b) { // 如果优先队列中的任务数量小于b
                    q1.add(i + x[l + 1]); // 将任务添加到队列
                    max = Math.max(max, i + x[l + 1]); // 更新最大完成时间
                } else {
                    q.add(l); // 否则将任务加入队列等待执行
                }

                // 如果队列中任务超出a个，移除多余的任务
                while (q.size() > a) {
                    q.poll(); // 移除队列中的任务
                    ans++; // 增加移除任务的次数
                }
                l += 2; // 增加任务索引，处理下一个任务
            }
        }

        // 输出最终的最大完成时间和移除任务的次数
        pw.println(max + " " + ans);
        pw.flush(); // 输出结果
    }

    // 读取下一个整数
    public static int nextInt() throws Exception {
        st.nextToken();
        return (int) st.nval; // 返回读取到的整数
    }

    // 读取下一个长整数
    public static long nextLong() throws Exception {
        st.nextToken();
        return (long) st.nval; // 返回读取到的长整数
    }
}